package com.zuipin.util;

import java.net.ConnectException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Date;
import java.util.Random;
import java.util.UUID;

import org.apache.log4j.Logger;
import org.apache.log4j.chainsaw.Main;
import org.springframework.beans.factory.annotation.Value;

import com.esms.MOMsg;
import com.esms.MessageData;
import com.esms.PostMsg;
import com.esms.common.entity.Account;
import com.esms.common.entity.BusinessType;
import com.esms.common.entity.GsmsResponse;
import com.esms.common.entity.MTPack;
import com.esms.common.entity.MTPack.SendType;
import com.esms.common.entity.MTReport;
import com.esms.common.entity.MTResponse;
import com.esms.common.util.MediaUtil;

public class SmsSendUtil {
	private static final Logger	log			= Logger.getLogger(SmsSendUtil.class);
	//@Value("${sms.sendFlag}")
	private static String		smsFlag;					// 短信开关
	
	
	public static void main(String[] args) {
		Random random = new Random();
		Integer sendCode = random.nextInt(8999) + 1000;
		String concat = "验证码：" + sendCode + ",验证码5分钟内输入有效!";
		String mobile="18850588847";
		String smsAccount="cyfw@xmzpsc";
		String smsPassword="htXx7W8k";
		String sendFlag="true";
		SmsSendUtil.doSendSms(mobile.trim(), concat, new Account(smsAccount, smsPassword),
				sendFlag);// 发短信
	}
	
	/**
	 * 发送短信
	 *
	 * @Title: doSendSms 
	 * @author: wuyicheng
	 * @date: 2017年4月23日上午11:28:42 
	 * @param mobile
	 * @param content
	 * @param ac
	 * @param smsFlag
	 * @return
	 * @return: boolean
	 * @throws
	 */
	public static boolean doSendSms(String mobile, String content, Account ac,String smsFlag) {
		if (smsFlag != null && smsFlag.equals("true")) {
			log.info("------------------短信接口已开------------------");
			PostMsg pm = new PostMsg();
			// mos网关
			pm.getCmHost().setHost("211.147.239.62", 9080);// 设置网关的IP和port，用于发送信息
			pm.getWsHost().setHost("211.147.239.62", 9070);// 设置网关的 IP和port，用于获取账号信息、上行、状态报告等等
			MTPack pack = new MTPack();
			pack.setBatchID(UUID.randomUUID());
			pack.setBatchName("茶叶服务" + mobile);
			pack.setMsgType(MTPack.MsgType.SMS);
			pack.setBizType(0);
			pack.setDistinctFlag(false);
			pack.setSendType(SendType.GROUP);
			ArrayList<MessageData> msgs = new ArrayList<MessageData>();
			
			// /** 单发，一号码一内容 */
			msgs.add(new MessageData(mobile, content));
			log.info("sendTime:" + DateUtils.formatDate(new Date()));
			log.info("mobile:" + mobile);
			log.info("sendCode:" + content);
			pack.setMsgs(msgs);
			
			/** 群发，多号码一内容 */
			// pack.setSendType(MTPack.SendType.MASS);
			// String content = "短信发送测试";
			// msgs.add(new MessageData("13430258111", content));
			// msgs.add(new MessageData("13430258222", content));
			// msgs.add(new MessageData("13430258333", content));
			// pack.setMsgs(msgs);
			
			// /** 组发，多号码多内容 */
			// pack.setSendType(SendType.GROUP);
			// msgs.add(new MessageData("13430258111", "短信组发测试111"));
			// msgs.add(new MessageData("13430258222", "短信组发测试222"));
			// msgs.add(new MessageData("13430258333", "短信组发测试333"));
			// pack.setMsgs(msgs);
			
			/** 设置模板编号(静态模板将以模板内容发送; 动态模板需要发送变量值，JSON格式：[{"key":"变量名1","value":"变量值1"},{"key":"变量名2","value":"变量值2"}]) */
			// pack.setTemplateNo("test");
			
			GsmsResponse resp;
			try {
				resp = pm.post(ac, pack);
				if (resp.getResult() == 0) {
					return true;
				} else {
					System.out.println(resp);
					return false;
				}
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			return false;
		} else {
			log.info("------------------短信接口已关------------------");
			return false;
		}
		
	}
	
	/**
	 * 发送短信
	 *
	 * @Title: doSendSms 
	 * @author: wuyicheng
	 * @date: 2017年4月19日下午6:06:22 
	 * @param mobile 手机号
	 * @param content 短信内容
	 * @param ac 短信平台账户
	 * @return
	 * @return: boolean
	 * @throws
	 */
	public static boolean doSendSms(String mobile, String content, Account ac) {
		if (smsFlag != null && smsFlag.equals("true")) {
			log.info("------------------短信接口已开------------------");
			PostMsg pm = new PostMsg();
			// mos网关
			pm.getCmHost().setHost("211.147.239.62", 9080);// 设置网关的IP和port，用于发送信息
			pm.getWsHost().setHost("211.147.239.62", 9070);// 设置网关的 IP和port，用于获取账号信息、上行、状态报告等等
			MTPack pack = new MTPack();
			pack.setBatchID(UUID.randomUUID());
			pack.setBatchName("茶叶服务" + mobile);
			pack.setMsgType(MTPack.MsgType.SMS);
			pack.setBizType(0);
			pack.setDistinctFlag(false);
			pack.setSendType(SendType.GROUP);
			ArrayList<MessageData> msgs = new ArrayList<MessageData>();
			
			// /** 单发，一号码一内容 */
			msgs.add(new MessageData(mobile, content));
			System.out.println("mobile:" + mobile + "          content:" + content);
			pack.setMsgs(msgs);
			
			/** 群发，多号码一内容 */
			// pack.setSendType(MTPack.SendType.MASS);
			// String content = "短信发送测试";
			// msgs.add(new MessageData("13430258111", content));
			// msgs.add(new MessageData("13430258222", content));
			// msgs.add(new MessageData("13430258333", content));
			// pack.setMsgs(msgs);
			
			// /** 组发，多号码多内容 */
			// pack.setSendType(SendType.GROUP);
			// msgs.add(new MessageData("13430258111", "短信组发测试111"));
			// msgs.add(new MessageData("13430258222", "短信组发测试222"));
			// msgs.add(new MessageData("13430258333", "短信组发测试333"));
			// pack.setMsgs(msgs);
			
			/** 设置模板编号(静态模板将以模板内容发送; 动态模板需要发送变量值，JSON格式：[{"key":"变量名1","value":"变量值1"},{"key":"变量名2","value":"变量值2"}]) */
			// pack.setTemplateNo("test");
			
			GsmsResponse resp;
			try {
				resp = pm.post(ac, pack);
				if (resp.getResult() == 0) {
					return true;
				} else {
					System.out.println(resp);
					return false;
				}
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			return false;
		} else {
			log.info("------------------短信接口已关------------------");
			return false;
		}
		
	}
	
	// 扩展接口范例
	public static void extend() throws Exception {
		Account ac = new Account("xmzpsc@xmzpsc", "");
		PostMsg pm = new PostMsg();
		// mos网关
		pm.getCmHost().setHost("211.147.239.62", 9080);// 设置网关的IP和port，用于发送信息
		pm.getWsHost().setHost("211.147.239.62", 9070);// 设置网关的 IP和port，用于获取账号信息、上行、状态报告等等
		// 400网关
		// pm.getCmHost().setHost("211.147.239.62", 8450);//设置网关的IP和port，用于发送信息
		// pm.getWsHost().setHost("211.147.239.62", 8460);//设置网关的 IP和port，用于获取账号信息、上行、状态报告等等
		// /**代理上网设置,如果需要*/
		// HostInfo proxyHost = new HostInfo("192.168.0.47", 1080);
		// proxyHost.setType(HostInfo.ConnectionType.SOCKET4); //设置连接类型
		// proxyHost.setUsername("004"); //设置用户名
		// proxyHost.setPassword("123"); //设置密码
		// pm.getProxy().setProxy(proxyHost); //设置代理
		
		doSendSms(pm, ac); // 短信下行
		// doSendMms(pm, ac); //彩信下行
		
		// doGetAccountInfo(pm, ac); //获取账号信息
		// doModifyPwd(pm, ac); //修改密码
		
		// doFindResps(pm, ac); //查询提交报告
		// doFindReports(pm, ac); //查询状态报告
		
		// doGetMos(pm, ac); //获取上行信息
		// doGetResps(pm, ac); //获取提交报告
		// doGetReports(pm, ac); //获取状态报告
	}
	
	/**
	 * 短信下发范例
	 * 
	 * @param pm
	 * @param ac
	 */
	public static void doSendSms(PostMsg pm, Account ac) throws Exception {
		MTPack pack = new MTPack();
		pack.setBatchID(UUID.randomUUID());
		pack.setBatchName("短信测试批次");
		pack.setMsgType(MTPack.MsgType.SMS);
		pack.setBizType(0);
		pack.setDistinctFlag(false);
		pack.setSendType(SendType.GROUP);
		ArrayList<MessageData> msgs = new ArrayList<MessageData>();
		
		// /** 单发，一号码一内容 */
		msgs.add(new MessageData("13328762499", "接口短信单发测试"));
		pack.setMsgs(msgs);
		
		/** 群发，多号码一内容 */
		// pack.setSendType(MTPack.SendType.MASS);
		// String content = "短信发送测试";
		// msgs.add(new MessageData("13430258111", content));
		// msgs.add(new MessageData("13430258222", content));
		// msgs.add(new MessageData("13430258333", content));
		// pack.setMsgs(msgs);
		
		// /** 组发，多号码多内容 */
		// pack.setSendType(SendType.GROUP);
		// msgs.add(new MessageData("13430258111", "短信组发测试111"));
		// msgs.add(new MessageData("13430258222", "短信组发测试222"));
		// msgs.add(new MessageData("13430258333", "短信组发测试333"));
		// pack.setMsgs(msgs);
		
		/** 设置模板编号(静态模板将以模板内容发送; 动态模板需要发送变量值，JSON格式：[{"key":"变量名1","value":"变量值1"},{"key":"变量名2","value":"变量值2"}]) */
		// pack.setTemplateNo("test");
		
		GsmsResponse resp = pm.post(ac, pack);
		System.out.println(resp);
	}
	
	/**
	 * 短信下发改写
	 * 
	 * @param pm
	 * @param ac
	 */
	public static boolean doSendSms(String mobile, String content,String smsFlag) {
		
		if (smsFlag != null && smsFlag.equals("true")) {
			log.info("------------------短信接口已开------------------");
			Account ac = new Account("xmzpsc@xmzpsc", "");
			PostMsg pm = new PostMsg();
			// mos网关
			pm.getCmHost().setHost("211.147.239.62", 9080);// 设置网关的IP和port，用于发送信息
			pm.getWsHost().setHost("211.147.239.62", 9070);// 设置网关的 IP和port，用于获取账号信息、上行、状态报告等等
			MTPack pack = new MTPack();
			pack.setBatchID(UUID.randomUUID());
			pack.setBatchName("茶帮通短信批次");
			pack.setMsgType(MTPack.MsgType.SMS);
			pack.setBizType(0);
			pack.setDistinctFlag(false);
			pack.setSendType(SendType.GROUP);
			ArrayList<MessageData> msgs = new ArrayList<MessageData>();
			
			// /** 单发，一号码一内容 */
			msgs.add(new MessageData(mobile, content));
			pack.setMsgs(msgs);
			
			/** 群发，多号码一内容 */
			// pack.setSendType(MTPack.SendType.MASS);
			// String content = "短信发送测试";
			// msgs.add(new MessageData("13430258111", content));
			// msgs.add(new MessageData("13430258222", content));
			// msgs.add(new MessageData("13430258333", content));
			// pack.setMsgs(msgs);
			
			// /** 组发，多号码多内容 */
			// pack.setSendType(SendType.GROUP);
			// msgs.add(new MessageData("13430258111", "短信组发测试111"));
			// msgs.add(new MessageData("13430258222", "短信组发测试222"));
			// msgs.add(new MessageData("13430258333", "短信组发测试333"));
			// pack.setMsgs(msgs);
			
			/** 设置模板编号(静态模板将以模板内容发送; 动态模板需要发送变量值，JSON格式：[{"key":"变量名1","value":"变量值1"},{"key":"变量名2","value":"变量值2"}]) */
			// pack.setTemplateNo("test");
			
			GsmsResponse resp;
			try {
				resp = pm.post(ac, pack);
				if (resp.getResult() == 0) {
					return true;
				} else {
					System.out.println(resp);
					return false;
				}
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			return false;
			
		} else {
			log.info("------------------短信接口已关------------------");
			return false;
		}
		
	}
	
	
	
	/**
	 * 彩信下发范例
	 * 
	 * @param pm
	 * @param ac
	 */
	public static void doSendMms(PostMsg pm, Account ac) throws Exception {
		MTPack pack = new MTPack();
		pack.setBatchID(UUID.randomUUID());
		pack.setBatchName("彩信测试批次");
		pack.setMsgType(MTPack.MsgType.MMS);
		pack.setBizType(1);
		pack.setDistinctFlag(false);
		ArrayList<MessageData> msgs = new ArrayList<MessageData>();
		
		String path = SmsSendUtil.class.getClassLoader().getResource("mms_test").getPath();
		path = URLDecoder.decode(path, "utf-8");
		
		// 设置公共彩信资源
		pack.setMedias(MediaUtil.getMediasFromFolder(path));
		
		// /** 单发，一号码一内容 */
		// msgs.add(new MessageData("13430258111", null));
		// pack.setMsgs(msgs);
		
		/** 群发，多号码一内容 */
		pack.setSendType(MTPack.SendType.MASS);
		msgs.add(new MessageData("13430258111", null));
		msgs.add(new MessageData("13430258222", null));
		msgs.add(new MessageData("13430258333", null));
		pack.setMsgs(msgs);
		
		// /** 组发，多号码多内容 */
		// pack.setSendType(MTPack.SendType.GROUP);
		// //设置私有彩信资源
		// MessageData msg1 = new MessageData("13430258111", null);
		// msg1.setMedias(MediaUtil.getMediasFromFolder("F:/mms_test/msg1"));
		// msgs.add(msg1);
		// MessageData msg2 = new MessageData("13430258222", null);
		// msg2.setMedias(MediaUtil.getMediasFromFolder("F:/mms_test/msg2"));
		// msgs.add(msg2);
		// MessageData msg3 = new MessageData("13430258333", null);
		// msg3.setMedias(MediaUtil.getMediasFromFolder("F:/mms_test/msg3"));
		// msgs.add(msg3);
		// pack.setMsgs(msgs);
		
		/** 设置模板编号(静态模板将以模板内容发送; 动态模板需要发送变量值，JSON格式：[{"key":"变量名1","value":"变量值1"},{"key":"变量名2","value":"变量值2"}]) */
		// pack.setTemplateNo("test");
		
		GsmsResponse resp = pm.post(ac, pack);
		System.out.println(resp);
	}
	
	/**
	 * 获取账号信息
	 * 
	 * @param pm
	 * @param account
	 * @throws Exception
	 */
	public static void doGetAccountInfo(PostMsg pm, Account ac) throws Exception {
		System.out.println(pm.getAccountInfo(ac)); // 获取账号详细信息
		
		BusinessType[] bizTypes = pm.getBizTypes(ac); // 获取账号绑定业务类型
		if (bizTypes != null) {
			for (BusinessType bizType : bizTypes) {
				System.out.println(bizType);
			}
		}
	}
	
	/**
	 * 获取上行信息
	 * 
	 * @param pm
	 * @param account
	 * @throws Exception
	 */
	public static void doGetMos(PostMsg pm, Account ac) throws Exception {
		MOMsg[] mos = pm.getMOMsgs(ac, 100);
		if (mos != null) {
			for (MOMsg mo : mos) {
				System.out.println(mo);
			}
		}
	}
	
	/**
	 * 查询提交报告
	 * 
	 * @param pm
	 * @param ac
	 * @throws Exception
	 */
	public static void doFindResps(PostMsg pm, Account ac) throws Exception {
		UUID batchID = UUID.fromString("3e1f13f4-1677-41f1-b67d-702f2c01eafb"); // 如果需要按批次ID来查询
		MTResponse[] foundMtResps = pm.findResps(ac, 1, batchID, null, 0);
		if (foundMtResps != null) {
			for (MTResponse resp : foundMtResps) {
				System.out.println(resp);
			}
		}
	}
	
	/**
	 * 获取提交报告
	 * 
	 * @param pm
	 * @param ac
	 * @throws Exception
	 */
	public static void doGetResps(PostMsg pm, Account ac) throws Exception {
		MTResponse[] mtResps = pm.getResps(ac, 100);
		if (mtResps != null) {
			for (MTResponse resp : mtResps) {
				System.out.println(resp);
			}
		}
	}
	
	/**
	 * 查询状态报告
	 * 
	 * @param pm
	 * @param ac
	 * @throws Exception
	 */
	public static void doFindReports(PostMsg pm, Account ac) throws Exception {
		UUID batchID = UUID.fromString("3e1f13f4-1677-41f1-b67d-702f2c01eafb"); // 如果需要按批次ID来查询
		MTReport[] foundMtReports = pm.findReports(ac, 1, batchID, null, 0);
		if (foundMtReports != null) {
			for (MTReport report : foundMtReports) {
				System.out.println(report);
			}
		}
	}
	
	/**
	 * 获取状态报告
	 * 
	 * @param pm
	 * @param ac
	 * @throws Exception
	 */
	public static void doGetReports(PostMsg pm, Account ac) throws Exception {
		MTReport[] mtReports = pm.getReports(ac, 100);
		if (mtReports != null) {
			for (MTReport report : mtReports) {
				System.out.println(report);
			}
		}
	}
	
	/**
	 * 修改密码
	 * 
	 * @param pm
	 * @param ac
	 * @throws Exception
	 */
	public static void doModifyPwd(PostMsg pm, Account ac) throws Exception {
		System.out.println(pm.modifyPassword(ac, ""));
	}
	
	// 兼容接口范例
	public static void compatibility() throws ConnectException {
		
		// 设置部分
		PostMsg pm = new PostMsg("admin", ""); // 创建实例时，需输入用户名与密码
		pm.getCmHost().setHost("127.0.0.1", 8089); // 设置网关的IP和port
		pm.getWsHost().setHost("127.0.0.1", 8088); // 设置WebService的 IP和port
		// pm.getProxy().setProxy(ProxyServer.PROXY_TYPE_SOCKS4, "192.168.0.47", 1080); //设置代理
		//
		//
		int resp = -1;
		/** 单发，一号码一内容 */
		resp = pm.post("13430258111", "短信单发测试", "");
		//
		// /** 群发，多号码一内容 */
		// resp = pm.post(new String[]{"13430258111", "13430258222", "13430258333"}, "短信群发测试", "");
		//
		// /** 组发，多号码多内容 */
		// MessageData[] msgs = new MessageData[3];
		// msgs[0] = new MessageData("13430258111", "短信组发测试111");
		// msgs[1] = new MessageData("13430258222", "短信组发测试222");
		// msgs[2] = new MessageData("13430258333", "短信组发测试333");
		// resp = pm.post(msgs, "");
		
		System.out.println("响应：" + resp);
		
		// 修改密码
		// System.out.println(pm.modifyPassword("123456"));
		
		// System.out.println(pm.getConfigInfo()); //获取用户详细信息
		// MOMsg[] momsgs = pm.getMOMsg(); //获取上行信息
		// if(momsgs != null){
		// for(MOMsg momsg : momsgs){
		// System.out.println(momsg);
		// }
		// }
	}
	
		
	private static String getReturnParam(String[] re) {
		String tmpStr = "";
		if (re[0].equals("-1")) {
			tmpStr = "用户名或者密码不正确或用户禁用";
			log.info("返回参数：" + re[0] + ", 描述： " + tmpStr);
		} else if (re[0].equals("1")) {// 及时
			tmpStr = " 发送短信成功";
			log.info("返回参数：" + re[0] + ", 描述：" + tmpStr + "【及时】");
		} else if (re[0].equals("0")) {
			tmpStr = "发送短信失败";
			log.info("返回参数：" + re[0] + ", 描述： " + tmpStr);
		} else if (re[0].equals("2")) {
			tmpStr = "余额不够或扣费错误";
			log.info("返回参数：" + re[0] + ", 描述： " + tmpStr);
		} else if (re[0].equals("3")) {
			tmpStr = "扣费失败异常（请联系客服）";
			log.info("返回参数：" + re[0] + ", 描述： " + tmpStr);
		} else if (re[0].equals("5")) {
			tmpStr = "发送短信成功";
			log.info("返回参数：" + re[0] + ", 描述： " + tmpStr + "【定时】");
		} else if (re[0].equals("6")) {
			tmpStr = "有效号码为空";
			log.info("返回参数：" + re[0] + ", 描述： " + tmpStr);
		} else if (re[0].equals("7")) {
			tmpStr = "短信内容为空";
			log.info("返回参数：" + re[0] + ", 描述： " + tmpStr);
		} else if (re[0].equals("8")) {
			tmpStr = "无签名";
			log.info("返回参数：" + re[0] + ", 描述： " + tmpStr);
		} else if (re[0].equals("9")) {
			tmpStr = "没有Url提交权限";
			log.info("返回参数：" + re[0] + ", 描述： " + tmpStr);
		} else if (re[0].equals("10")) {
			tmpStr = "发送号码过多,最多支持200个号码";
			log.info("返回参数：" + re[0] + ", 描述： " + tmpStr);
		} else if (re[0].equals("11")) {
			tmpStr = "产品ID异常或产品禁用";
			log.info("返回参数：" + re[0] + ", 描述： " + tmpStr);
		} else if (re[0].equals("12")) {
			tmpStr = "参数异常";
			log.info("返回参数：" + re[0] + ", 描述： " + tmpStr);
		} else if (re[0].equals("13")) {
			tmpStr = "30分种重复提交";
			log.info("返回参数：" + re[0] + ", 描述： " + tmpStr);
		} else if (re[0].equals("14")) {
			tmpStr = "用户名或密码不正确，产品余额为0，禁止提交，联系客服";
			log.info("返回参数：" + re[0] + ", 描述： " + tmpStr);
		} else if (re[0].equals("15")) {
			tmpStr = "Ip验证失败";
			log.info("返回参数：" + re[0] + ", 描述： " + tmpStr);
		} else if (re[0].equals("19")) {
			tmpStr = "短信内容过长，最多支持500个";
			log.info("返回参数：" + re[0] + ", 描述： " + tmpStr);
		} else if (re[0].equals("20")) {
			tmpStr = "定时时间不正确：格式：20130202120212(14位数字)";
			log.info("返回参数：" + re[0] + ", 描述： " + tmpStr);
		}
		return tmpStr;
	}
}
